package base.jdk8_demo.lambda.demo09;

import base.jdk8_demo.lambda.demo02.Emp;
import org.junit.Test;

import java.util.Optional;

/**
 * jdk8 提供的为了更好的处理 null 这种导致的空指针异常，提供了 Optional.
 * Optional 容器类的常用方法测试
 */
public class OptionalTest {

    /**
     * of 方法测试, 创建一个Optional实例
     */
    @Test
    public void ofTest(){
        // 通过 of 方法将新创建的 Emp 对象放入Optional 这个容器中
        Optional<Emp> op = Optional.of(new Emp());
        // 获取容器中的Emp对象
        Emp emp = op.get();
        System.out.println(emp);
    }

    /**
     * empty 和 ofNullable 方法测试。
     * empty ： 创建 一个空的 Optional实例
     * ofNullable：根据入参不为null，就创建一个Optional实例，否则创建空实例
     */
    @Test
    public void emptyTest(){
        Optional<Emp> op = Optional.empty();
        System.out.println(op);
//        System.out.println("Optional里面没有Emp实例："+op.get());

        Optional<Emp> op2 = Optional.ofNullable(null);
        System.out.println("Optional里面没有Emp实例："+op2.orElse(new Emp(1,"zs",20)));
    }

    /**
     * isPresent 方法测试，判断Optional 里面是否有对象
     */
    @Test
    public void isPresentTest(){
        Optional<Emp> op = Optional.ofNullable(new Emp());
        if(op.isPresent()){
            System.out.println("Optional里面有Emp实例："+op.get());
        }
    }

    /**
     * orElse(T t) 方法测试，
     * 如果Optional 容器中有值，就返回Optional中的值，否则返回t
     */
    @Test
    public void orElseTest(){
//        Optional<Emp> op = Optional.ofNullable(null);
        Optional<Emp> op = Optional.ofNullable(new Emp());
        System.out.println(op);
        Emp zs = op.orElse(new Emp("张三", 18));
        System.out.println(zs);
    }

    /**
     * orElseGet(Supplier s) 方法测试，
     * 如果Optional 容器中有值，就返回该值，否则返回s 获取的值
     */
    @Test
    public void orElseGetTest(){
        Optional<Emp> op = Optional.ofNullable(null);
        System.out.println(op);
        Emp emp = op.orElseGet(() -> new Emp("哈哈"));
        System.out.println(emp);
    }

    /**
     * map(Function f) 方法测试，如果Optional 容器中有值，返回被f 处理后的Optional，否则返回Optional.empty()
     */
    @Test
    public void mapTest(){
        Optional<Emp> op = Optional.ofNullable(new Emp("李四", 18));
        Optional<String> s = op.map((e) -> e.getName());
        System.out.println(s.get());
    }

    /**
     * flatMap(Function f) 方法测试
     */
    @Test
    public void flatMapTest(){
        Optional<Emp> op = Optional.ofNullable(new Emp("李四2", 18));
        Optional<String> s = op.flatMap((e) -> Optional.of(e.getName()));
        System.out.println(s.get());
    }
}
